package com.hsurosy.hsuchain.nft.order.listener;

import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 订单关闭事务监听器
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 17:56
 * @Description
 * @Version: v1.0.0
 */
@Component
public class OrderCloseTransactionListener implements TransactionListener {

    private static final Logger logger = LoggerFactory.getLogger(OrderCloseTransactionListener.class);

    /**
     * 执行本地事务
     * <p>
     * 当 RocketMQ 发送事务消息后，调用该方法执行本地事务逻辑。
     * 根据事务执行的结果，返回相应的事务状态（提交、回滚或未知）。
     * </p>
     *
     * @param message 事务消息
     * @param o 事务的自定义参数
     * @return {@link LocalTransactionState} 事务的状态
     */
    @Override
    public LocalTransactionState executeLocalTransaction(Message message, Object o) {
        try {
            // 本地事务操作逻辑，如订单关闭、库存回滚等
            // 可以使用业务服务操作数据库等资源

            // 如果本地事务执行成功，返回提交事务的状态
            return LocalTransactionState.COMMIT_MESSAGE;
        } catch (Exception e) {
            // 如果发生异常，记录日志并返回回滚事务的状态
            logger.error("executeLocalTransaction error, message = {}", message, e);
            return LocalTransactionState.ROLLBACK_MESSAGE;
        }
    }

    /**
     * 检查本地事务状态
     * <p>
     * 当 RocketMQ 没有收到明确的事务状态时，会调用该方法检查本地事务的执行结果。
     * 该方法通常用于在网络问题或系统重启后，确保事务的一致性。
     * </p>
     *
     * @param messageExt 消息扩展对象
     * @return {@link LocalTransactionState} 本地事务的状态
     */
    @Override
    public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
        // 检查本地事务执行结果，根据业务逻辑决定返回 COMMIT 或 ROLLBACK
        // 此处可以查询数据库或调用其他服务来确认本地事务的执行结果

        // 假设本地事务已经成功，返回提交事务的状态
        return LocalTransactionState.COMMIT_MESSAGE;
    }
}
